#include <cassert>
#include "SdlJeu.h"

const int TAILLE_SPRITE=32;

SDL_Surface *SDL_load_image(const char* filename );
void SDL_apply_surface( SDL_Surface* source, SDL_Surface* destination, int x, int y );



void SdlJeuInit(SdlJeu& sj)
{
	JeuInitialise( sj.jeu );

	assert(SDL_Init( SDL_INIT_EVERYTHING )!= -1 );

	int dimx, dimy;
	dimx = TerGetDimX( JeuGetConstTerrain(sj.jeu) );
	dimy = TerGetDimY( JeuGetConstTerrain(sj.jeu) );
	dimx = dimx * TAILLE_SPRITE;
	dimy = dimy * TAILLE_SPRITE;
	sj.ecran = SDL_SetVideoMode(   dimx, dimy, 32, SDL_SWSURFACE );
	assert( sj.ecran );
	SDL_WM_SetCaption( "Tetris", NULL );

	sj.pacman = SDL_load_image("data/pacman.bmp");
	if (!sj.pacman) sj.pacman = SDL_load_image("../data/pacman.bmp");
	assert( sj.pacman );

	sj.mur = SDL_load_image("data/mur.bmp");
	if (!sj.mur) sj.mur = SDL_load_image("../data/mur.bmp");
	assert( sj.mur);
}



void adljeuAff(sdlJeu& sj)
{
	//Remplir l'écran de blanc
	SDL_FillRect( sj.ecran, &sj.ecran->clip_rect, SDL_MapRGB( sj.ecran->format, 0xFF, 0xFF, 0xFF ) );

	int x,y;

	const Terrain& ter = jeuGetConstTerrain(sj.jeu);
	const Pacman& pac = jeuGetConstPacman(sj.jeu);

	for (x=0;x<getDimX(ter);++x)
		for (y=0;y<getDimY(ter);++y)
			if (terGetXY(ter,x,y)=='#')
				SDL_apply_surface(  sj.mur, sj.ecran, x*TAILLE_SPRITE, (getDimY(ter)-1-y)*TAILLE_SPRITE);

	// Copier le sprite de Pacman sur sj.ecran
	SDL_apply_surface(  sj.pacman, sj.ecran, pacGetX(pac)*TAILLE_SPRITE,  (getDimY(ter)-1-pacGetY(pac))*TAILLE_SPRITE );
}



void sdljeuBoucle(sdlJeu& sj)
{
	SDL_Event event;
	bool quit = false;

	adljeuAff( sj );
	assert( SDL_Flip( sj.ecran )!=-1 );

	// tant que ce n'est pas la fin ...
	while ( quit == false )
	{
		// tant qu'il y a des evenements à traiter : cette boucle n'est pas bloquante
		while ( SDL_PollEvent( &event ) )
		{
			// Si l'utilisateur a cliqué sur la croix de fermeture
			if ( event.type == SDL_QUIT ) quit = true;

			// Si une touche est enfoncée
			if ( event.type == SDL_KEYDOWN )
			{
				switch ( event.key.keysym.sym )
				{
				case SDLK_UP:
					jeuActionClavier( sj.jeu, 'h');
					break;
				case SDLK_DOWN:
					jeuActionClavier( sj.jeu, 'b');
					break;
				case SDLK_LEFT:
					jeuActionClavier( sj.jeu, 'g');
					break;
				case SDLK_RIGHT:
					jeuActionClavier( sj.jeu, 'd');
					break;
				default: break;
				}
			}

		}

		// on affiche le jeu sur le buffer caché
		adljeuAff( sj );

		// on permute les deux buffers (cette fonction ne doit se faire qu'une seule fois dans a boucle)
		SDL_Flip( sj.ecran );
	}
}


void sdljeuDetruit( sdlJeu& sj)
{
	SDL_FreeSurface( sj.pacman );
	SDL_FreeSurface( sj.mur );
	SDL_Quit();
}



SDL_Surface *SDL_load_image(const char* filename )
{
	//Temporary storage for the image that's loaded
	SDL_Surface* loadedImage = NULL;

	//The optimized image that will be used
	SDL_Surface* optimizedImage = NULL;

	//Load the image
	loadedImage = SDL_LoadBMP( filename );

	//If nothing went wrong in loading the image
	if ( loadedImage != NULL )
	{
		//Create an optimized image
		optimizedImage = SDL_DisplayFormat( loadedImage );

		//Free the old image
		SDL_FreeSurface( loadedImage );
	}

	//Return the optimized image
	return optimizedImage;
}


void SDL_apply_surface( SDL_Surface* source, SDL_Surface* destination, int x, int y )
{
	//Make a temporary rectangle to hold the offsets
	SDL_Rect offset;

	//Give the offsets to the rectangle
	offset.x = x;
	offset.y = y;

	//Blit the surface
	SDL_BlitSurface( source, NULL, destination, &offset );
}
